perm filename PALINL.PAS[S1,ALS] blob sn#483576 filedate 1979-10-26 generic text, type C, neo UTF8
COMMENT āŠ—   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	(* $A+,D+*)
C00012 ENDMK
CāŠ—;
(* $A+,D+*)

program	PALINDROME(OUTPUT);

const	NUMMAX = 4; PALMAX = 100;  NUMLIM = 7; PALLIM = 101;
	TABMAX = 500;  TABLIM = 501;
var C, I, J, K, L, M, N, NXTOT, TABL, NMAX, NMIN, DCLASS,
	 NUMVAL, CVAL, CVAL2, PALTOT, PALVAL, CARRY : integer;
	CMIN, CMAX : integer; 
    NUM : array [1..NUMLIM] of integer;
    PAL, PAL2 : array [1..PALLIM] of integer;
    TAB : array [0..TABLIM] of integer;
    TEMP : array [1..5] of integer;

begin (* Main program*)
for I := 1 to NUMMAX do NUM[I] := 0;
NUM [2] := 1; NUMVAL := 2;		(* Initial conditions *)
writeln (OUTPUT,
	'  Palindrome formation tested to a maximum of',PALMAX:4,' digits');
writeln (OUTPUT);
while NUMVAL <= NUMMAX do
    begin (*while NUMVAL <= NUMMAX*)
    CVAL := NUMVAL div 2;
    CVAL2 := CVAL + NUMVAL mod 2;
    CMIN := 1;
    CMAX := 19;				(* gets reduced by 1 below*)
    if CVAL > 1 then for I := 2 TO CVAL do
	begin
	CMIN := CMIN * 19;
	CMAX := CMAX * 19;
	end;
    if (CVAL2 - CVAL) = 1 then
	begin
	CMIN := CMIN * 10;
	CMAX := CMAX * 10;
	end;
    CMAX :=  CMAX - 1;
	
    writeln (OUTPUT,'DATA FOR',NUMVAL:2,'-DIGIT DECIMAL NUMBERS');
    I := CMAX -CMIN + 1;
    writeln(OUTPUT,'   WHICH CAN BE GROUPED INTO',I:5,' CLASSES');
    writeln(OUTPUT);
    writeln(TTY);
    writeln (TTY,'DATA FOR',NUMVAL:2,'-DIGIT DECIMAL NUMBERS'); BREAK;
    writeln(OUTPUT,'CLASS   ADDS   RESULTING PALINDROME');
    writeln(OUTPUT,
	'               only classes requiring 4 or more adds are shown');
    DCLASS := NUMVAL;
    for I := 1 TO PALMAX do PAL[I] := 0;
    for I := 0 to TABMAX do TAB[I] := 0;    (* palindrome add data *)
    PALTOT := 0;                            (* Count of number of palindromes *)
    NXTOT := 0;                             (* Count of non-palindromes*)
    NMAX := 0;				    (* Maximum adds for a palindrome*)
    NMIN := 500;                            (* Minimun adds for intransigents *)
    M := 0;
    for C := CMIN to CMAX do
	begin				(* FOR C := CMIN TO CMAX*)
	I := C;
	J := CVAL;  L := CVAL2 + 1;
	if (CVAL2 - CVAL) = 1 then
	    begin
	    TEMP[CVAL2] := I mod 10;
	    NUM[CVAL2] := TEMP[CVAL2];
	    I := I div 10;
	    end;
	for K := CVAL downto 1 do
	    begin
	    TEMP[K] := I mod 19;
	    if TEMP[K] < 10 then
		begin
		if K = 1 then
		    begin
		    NUM[L] := TEMP[K] -1;
		    NUM[J] := 1;
		    end
		else 
		    begin
		    NUM[L] := TEMP[K];
		    NUM[J] := 0;
		    end;
		end
	    else
		begin
		NUM[L] := 9;
		NUM[J] := TEMP[K] - 9;
		end;
	    J := J - 1;
	    L := L + 1;
	    I := I div 19;
	    end;
(*	for I := 1 to NUMVAL  do write(TTY,NUM[I]:1); write(TTY,'  '); *)
	N := 0;                         (* To count number of additions *)
	for I := 1 to NUMVAL do PAL[I] := NUM[I];
	for I := NUMVAL + 1 TO PALMAX do PAL[I] := 0;
	PALVAL := NUMVAL;
	while PALVAL <= PALMAX do
	    begin                                   (* while PALVAL <= PALMAX*)
	    I := 1; J := PALVAL;
	    while ((PAL[I] = PAL [J]) and (I < J)) do
		begin
		I := I + 1;  J := J - 1;
		end;
	    if I >= J then
		begin
		TAB[N] := TAB[N] + 1;		(*Add to table of depths*)
		if N > NMAX then NMAX := N;
		if N > 3 then
		    begin
		    for J := 1 to CVAL2 do
			begin
			write (OUTPUT,TEMP[J]:3);
			write (TTY,TEMP[J]:3);
			end;
		    write(OUTPUT,N:6,'   ');
		    for I := 1 to PALVAL do
			begin
			write(OUTPUT,PAL[I]:1);
			if I = 72 then
			    begin
			    writeln(OUTPUT);
			    write(OUTPUT,'          ');
			    end;
			end;
		    writeln(OUTPUT);
		    end;
		PALTOT := PALTOT + 1;
		PALVAL := PALMAX + 1;
		end
	    else                                   (* Still not a palindrome*)
		begin                               (* try another add*)
		J := PALVAL; CARRY := 0;
		for I := 1 to PALVAL do
		    begin                           (* Add numbers*)
		    PAL2[I] := PAL[I] + PAL[J] + CARRY;
		    if PAL2[I] > 9 then
			begin
			PAL2[I] := PAL2[I] - 10;  CARRY := 1;
			end
		    else CARRY := 0;
		    J := J - 1;
		    end;                            (* add numbers*)
		if CARRY = 1 then
		    begin
		    PALVAL := PALVAL +1; PAL2[PALVAL] := 1;
		    end;
		N := N + 1;
		for I := 1 to PALVAL do PAL[I] := PAL2[I];
		end;

	    end                      (* while PALVAL <= PALMAX*);
	end;				(* FOR C := CMIN TO CMAX*)
    writeln(OUTPUT);
    writeln(OUTPUT,'palindromes grouped as to their add depths');
    writeln(OUTPUT);
    writeln(OUTPUT,
        '      ADDS  CLASSES   ADDS  CLASSES   ADDS  CLASSES   ADDS  CLASSES');
    M := 0;
    for I := 0 to NMAX do
	begin
	if TAB[I] <> 0 then
	    begin
	    write(OUTPUT,I:10,TAB[I]:6);
	    M := M + 1;
	    if (M mod 4) = 0 then writeln(OUTPUT);
	    end;
	end;
    writeln(OUTPUT);
    writeln(OUTPUT);
    NUMVAL := NUMVAL + 1;
    end (*while NUMVAL <= NUMMAX*);
end.